package matrix;

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

/**
 * @className: LeetCode_73
 * @Description: ...
 * @author: kunkun
 * @date: 2025/3/19 21:33
 */
public class LeetCode_73 {

    public void setZeroes(int[][] matrix) {
        solution_2(matrix);
    }

    @Test
    public void test(){
        solution_2(new int[][]{{1},{2}});
    }

    /**
     * @Author kunkun
     * @Description 使用set，时间复杂度：O（m*n），空间复杂度：O（m+n）
     * @Date 22:11 2025/3/22
     * @Param
     * @return
     **/
    private void solution_1(int[][] matrix) {
        //1. 定义set存储需要置0的行和列
        Set<Integer> setRow = new HashSet<>();
        Set<Integer> setCol = new HashSet<>();

        //2. 对set存储值
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j]==0){
                    setRow.add(i);
                    setCol.add(j);
                }
            }
        }

        //3. 进行置0操作
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (setRow.contains(i) || setCol.contains(j)){
                    matrix[i][j]=0;
                }
            }
        }
    }

    /**
     * @Author kunkun
     * @Description 可以将信息存储在第一列和第一行中
     * @Date 22:11 2025/3/22
     * @Param
     * @return
     **/
    private void solution_2(int[][] matrix) {
        //0. 寻找0（外圈）
        boolean row=false,col = false;
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i][0]==0){
                col = true;
            }
        }
        for (int j = 0; j <  matrix[0].length; j++) {
            if (matrix[0][j]==0){
                row = true;
            }
        }
        //1. 寻找0（内圈）
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[i].length; j++) {
                if (matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        //2. 置0（对于内圈）
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[i].length; j++) {
                if (matrix[i][0]==0 || matrix[0][j]==0){
                    matrix[i][j]=0;
                }
            }
        }
        //3. 外圈置0
        if (row){
            for (int j = 0; j <  matrix[0].length; j++) {
                matrix[0][j]=0;
            }
        }
        if (col){
            for (int i = 0; i <  matrix.length; i++) {
                matrix[i][0]=0;
            }
        }

    }


}
